package com.niit.covid.statePartition;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;

import java.util.HashMap;

/**
 * @author:Ys
 * @date: 2022年08月12日 14:55
 * @desc:
 */
public class StatePartitioner extends Partitioner<Text,Text> {

    //模拟美国各州的数据字典，实际中可以从redis进行读取加载，如果数据量不大，也可以创建数据集合保存
    public static HashMap<String,Integer> stateMap= new HashMap<String, Integer>();
    static {
        stateMap.put("Alabama",0);
        stateMap.put("Alaska",1);
        stateMap.put("Arkansas",2);
        stateMap.put("California",3);
        stateMap.put("Colorado",4);
    }

    /**
     *  todo 自定义分区器中分区规则的实现方法  只要getPartition返回的int一样，数据就会被分到同一个分区
     *  所谓同一个分区指的是数据到同一个reducetask处理
     *  k：state州 -------字符串===Text
     *  v：这一行内容  -------字符串整体，无需封装==Text
     */
    @Override
    public int getPartition(Text key, Text value, int i) {
        // 根据map 输出的key 得到分区号
        Integer code = stateMap.get(key.toString());
        if(code !=null){
            return code;
        }else{
            return 5; //如果key不在我的数据字典中，则返回5，就是分到其他州的结果文件中
        }
    }
}
